热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

都会|患者_Swift两种方式实现async/await并发模型中任务超时(timeout)的取消

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Swift两种方式实现async/await并发模型中任务超时(timeout)的取消相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Swift 两种方式实现 async/await 并发模型中任务超时(timeout)的取消相关的知识,希望对你有一定的参考价值。



文章目录


  • 1. 概览
  • 2. Task 超时取消实现之思路
  • 3. 第一种实现
  • 4. 第二种实现
  • 5. 总结


1. 概览

从 Swift 5.5 开始,Apple 引入了新的 async/await 并发模型,我们可以利用它很方便的开发结构化并发代码。

在使用新的并发模型时,一个常见的需求就是任务超时的处理。

我们希望当耗时任务的执行在到达指定时间后自动取消,以免影响用户体验。

在本篇博文中,我们将用两种方法来实现新并发模型中 Task 执行的超时处理。

废话少叙,Let’s Go!!!😉




2. Task 超时取消实现之思路

在 Swift 新 async/await 并发模型中,每个 Task 都会并发执行。所以,要想实现任务超时处理我们只需要同时执行两个任务:


  1. 第一个是需要完成的任务;
  2. 第二个是超时监控任务,用它来监听第一个任务是否已超时,如果是则果断取消它;

有的小伙伴可能觉得实现监控任务有点棘手,其实,这超乎意料的简单!


3. 第一种实现

我们只需保存执行的 Task 对象,然后在超时发生时,在第二个超时监控任务中将其取消即可,代码如下:

struct TimedOutError: Error, Equatable
func execute<R>(timeout: TimeInterval, task: &#64;escaping () async throws -> R) async throws -> R

let task &#61; Task
try await task()


Task
try? await Task.sleep(until: .now &#43; .seconds(timeout), clock: .continuous)
task.cancel()


do
return try await task.value
catch
// 如果任务被取消&#xff0c;则我们知道任务超时了
if task.isCancelled
throw TimedOutError()

throw error


正如之前的实现思路&#xff0c;我们依次创建了两个任务&#xff1a;第一个是需要完成的任务&#xff0c;第二个则是超时监控任务&#xff1b;在第二个任务中&#xff0c;一旦超时到达&#xff0c;则取消第一个任务。

Task
do
let r &#61; try await execute(timeout: 3.0)
// 任务会触发超时&#xff0c;将被取消&#xff01;
try await Task.sleep(until: .now &#43; .seconds(3.1), clock: .continuous)
return 11


print("结果是 \\(r)")
catch
print("ERR: \\(error.localizedDescription)")


不过&#xff0c;这样有两个小问题&#xff1a;


  1. 如果第一个任务在超时前完成&#xff0c;超时监控任务在超时后仍会尝试取消它&#xff1b;
  2. 当任务执行出现异常时&#xff0c;我们需要判断任务是否被取消&#xff0c;然后再抛出 TimedOutError 错误&#xff1b;

虽然&#xff0c;这并不影响整个 execute() 方法的逻辑&#xff0c;但如果小伙伴们是强迫症患者&#xff0c;我们还有第二种方法可以选择。


4. 第二种实现

第二种方法和前者类似&#xff0c;不过这里我们利用了新并发模型中任务组&#xff08;TaskGroup&#xff09;的特点&#xff1a;其中所有子任务都会并发执行&#xff0c;而且我们可以取消所有子任务。

func execute2<R>(timeout: TimeInterval, task: &#64;escaping () async throws -> R) async throws -> R
try await withThrowingTaskGroup(of: R.self) group in
group.addTask
try await task()


group.addTask
try await Task.sleep(until: .now &#43; .seconds(timeout), clock: .continuous)
throw TimedOutError()


let result &#61; try await group.next()!
// 一旦我们取消所有子任务&#xff0c;则超时监控任务不会在正常任务未超时还抛出异常
group.cancelAll()
return result


如上代码所示&#xff0c;用 TaskGroup 来实现任务超时逻辑更加清晰&#xff0c;而且避免了第一种方法中的两个问题。



更多 Task 任务超时的讨论请参考下面的链接&#xff1a;

Running an async task with a timeout




5. 总结

在本篇博文中&#xff0c;我们用两种方法实现了 Swift 新 async/await 并发模型中任务超时的取消&#xff0c;任君选择。

感谢观赏&#xff0c;再会&#xff01;&#x1f60e;


推荐阅读
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
author-avatar
淘气小顽童刘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有